﻿using System;
using ControleRepresentante.Common;
using ControleRepresentante.Logic.Models;
using ControleRepresentante.Migration.Models;
using ControleRepresentante.Migration.Repositories;

namespace ControleRepresentante.Migration.Steps
{
    internal class ClienteMigrateStep : MigrationStepBase
    {
        public override void Migrate(Guid representanteId, MigrationStatus migrationStatus, ControleRepresentanteRepository controleRepresentanteRepository, ZTRepository ztRepository, Guid userId)
        {
            migrationStatus.CurrentStep = "Migrate Clientes";

            int total = ztRepository.GetTotalClientes();

            Guid observacaoAttributeId = CreateAttribute(representanteId, "Observação", AttributeType.Cliente, controleRepresentanteRepository);
            Guid contatoAttributeId = CreateAttribute(representanteId, "Contato", AttributeType.Cliente, controleRepresentanteRepository);

            int index = 0;
            ztRepository.GetClientes().ExecuteBatch(1000, ztClientes =>
            {
                foreach (ZTCliente ztCliente in ztClientes)
                {
                    Guid clienteId = GetClienteId(ztCliente.Id);
                    Guid vendedorId = GetVendedorId(ztCliente.IdVendedor);
                    controleRepresentanteRepository.CreateCliente(representanteId, clienteId, vendedorId, ztCliente.CNPJ, ztCliente.InscricaoEstadual, ztCliente.RazaoSocial);
                    controleRepresentanteRepository.CreateAttributeValue(clienteId, observacaoAttributeId, ztCliente.Observacao);
                    controleRepresentanteRepository.CreateAttributeValue(clienteId, contatoAttributeId, ztCliente.Contato);
                    int codigoJolitex;
                    controleRepresentanteRepository.CreateClienteJolitex(clienteId, Int32.TryParse(ztCliente.CodigoJolitex, out codigoJolitex) ? codigoJolitex : (int?)null, ztCliente.Regiao);
                    controleRepresentanteRepository.CreateContato(clienteId, ContatoType.TelefoneComercial, true, ztCliente.Telefone);
                    controleRepresentanteRepository.CreateContato(clienteId, ContatoType.FaxComercial, true, ztCliente.Fax);
                    controleRepresentanteRepository.CreateContato(clienteId, ContatoType.Email, true, ztCliente.Email);
                    controleRepresentanteRepository.CreateContato(clienteId, ContatoType.TelefoneComercial, false, ztCliente.TelefoneEntrega, "Telefone entrega");
                    controleRepresentanteRepository.CreateContato(clienteId, ContatoType.FaxComercial, false, ztCliente.FaxEntrega, "Fax entrega");
                    controleRepresentanteRepository.CreateContato(clienteId, ContatoType.TelefoneComercial, false, ztCliente.TelefoneCobranca, "Telefone cobranca");
                    controleRepresentanteRepository.CreateContato(clienteId, ContatoType.FaxComercial, false, ztCliente.FaxCobranca, "Fax cobranca");
                    controleRepresentanteRepository.CreateEndereco(clienteId, EnderecoType.Comercial, true, ztCliente.Endereco, ztCliente.Bairro, ztCliente.CEP, ztCliente.Cidade, ztCliente.Estado);
                    Guid enderecoEntregaId = controleRepresentanteRepository.CreateEndereco(clienteId, EnderecoType.Comercial, false, ztCliente.EnderecoEntrega, ztCliente.BairroEntrega, ztCliente.CEPEntrega, ztCliente.CidadeEntrega, ztCliente.EstadoEntrega, string.Format("CNPJ: {0}\nInscricao Estadual: {1}", ztCliente.CNPJEntrega, ztCliente.InscricaoEstadualEntrega));
                    Guid enderecoCobrancaId = controleRepresentanteRepository.CreateEndereco(clienteId, EnderecoType.Comercial, false, ztCliente.EnderecoCobranca, ztCliente.BairroCobranca, ztCliente.CEPCobranca, ztCliente.CidadeCobranca, ztCliente.EstadoCobranca, string.Format("CNPJ: {0}\nInscricao Estadual: {1}", ztCliente.CNPJCobranca, ztCliente.InscricaoEstadualCobranca));
                    controleRepresentanteRepository.SetEnderecosForCliente(clienteId, enderecoEntregaId, enderecoCobrancaId);
                    migrationStatus.SetCurrentProgress(++index, total);
                }
            });
        }
    }
}